4823
16820
Kirjoitan tällä hetkellä XML-aromin perusjäsentäjää. Harjoituksena toteutan LL-taulukkopohjaisen jäsentimen.
Tämä on esimerkkini BNF-kieliopista:
% tunnuksen nimen tietosarja
%% / * LL (1) * /
doc: elem
elem: "<" open_tag
open_tag: nimi attr close_tag
close_tag: ">" elem_or_data ""
| "/>"
;
elem_or_data: "<" open_tag elem_or_data
| data elem_or_data
| / * epsilon * /
;
attr: nimi ":" merkkijono attr
| / * epsilon * /
;
Onko tämä kielioppi oikea?
Jokainen pääte-kirjain on lainausmerkkien välissä. Abstraktit päätteet määritetään% tokenillä.
Koodaan käsinkirjoitettua lexeria muuntamaan syötteeni merkkiluetteloksi. Kuinka merkitsisin abstraktit päätteet? 
Klassinen lähestymistapa olisi kirjoittaa säännöllinen lauseke (tai muu tunnistin) jokaiselle mahdolliselle päätteelle.
Mitä kutsutaan "abstrakteiksi" päätelaitteiksi, jotka ovat täysin konkreettisia, ovat itse asiassa päätelaitteita, joihin liittyvät mallit tunnistavat useamman kuin yhden mahdollisen syötemerkkijonon. Tosiasiallisesti tunnistettu merkkijono (tai jokin kyseisen merkkijonon laskettu funktio) on välitettävä jäsentäjälle tunnuksen semanttisena arvona.
Nimellisesti jokaisessa syötemerkkijonon kohdassa tokeniser suorittaa kaikki tunnistimet ja valitsee yhden, jolla on pisin vastaavuus. (Tämä on ns. "Maksimaalisen munch" -sääntö.) Tämä voidaan yleensä optimoida, varsinkin jos kaikki kuviot ovat säännöllisiä lausekkeita. (F) lex tekee kyseisen optimoinnin esimerkiksi sinulle.
Sinun tapauksessasi on monimutkainen, että kielesi merkitseminen riippuu asiayhteydestä. Erityisesti kun kohde on elem_or_data, ainoat mahdolliset tunnukset ovat <,